Mixin(混入),主要是拿來解決多重繼承的問題,類跟類的繼承關係可能挺複雜,繼承順序也可能很亂,遇到繼承的父類們剛好有同樣的方法名稱時就更雷了!
這時Mixin class就很好用了,繼承強調的是關係,Mixin強調的是功能,我只需要某類的功能,就Mixin一下,解決了多重繼承問題。
TypeScript2.2版出爐後,新增支持Mixin class功能,nestjs作者強調nestjs框架不容易傳遞一個參數到某程式區塊像Interceptors和Guards等,但可以透過mixin class方式達成目的。
npm install
import { Interceptor, NestInterceptor, ExecutionContext } from '@nestjs/common';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';
@Interceptor()
export abstract class CacheInterceptor implements NestInterceptor {
protected abstract readonly isCached: () => boolean;
intercept(): Observable<any> {
if (this.isCached()) {
return Observable.of([{ "data": "isCached true" }]);
}
return Observable.of([{ "data": "isCached false" }]);
}
}
import { mixin } from '@nestjs/common';
import { CacheInterceptor } from './cache.interceptor';
export function mixinCacheInterceptor(isCached: () => boolean) {
return mixin(class extends CacheInterceptor {
protected readonly isCached = isCached;
})
}
mixin是方法不實例化,這邊透過傳參改變isCached的值。
@Get('testMixinClass')
@UseInterceptors(mixinCacheInterceptor(() => false))
async testMixinClass() {
return "test mixin class";
}
可以傳入false參數,讓mixinCacheInterceptor去賦予isCached值。
5.1 實測一下,對http://localhost:3000/testMixinClass 做GET請求。@UseInterceptors(mixinCacheInterceptor(() => false))
5.2 實測一下,對http://localhost:3000/testMixinClass 做GET請求。@UseInterceptors(mixinCacheInterceptor(() => true))
透過mixin class,mixinCacheInterceptor得到了CacheInterceptor的成員,而mixinCacheInterceptor本身是方法,方法傳參還蠻容易的,這樣方式就避免多重繼承的可能問題又可以得到class的成員或方法來使用,有時候需要某class的方法時,用這招還挺不錯的。
程式碼都在github